package exception;

/**
 * 演示异常的抛出
 * throw关键字可以主动对外抛出一个异常
 * 通常下列情况会主动抛出异常:
 * 1:当程序出现了一个异常，但是该异常不应当有当前代码片段处理时可以将其抛出给上层调用者
 * 2:程序可以运行，但是不满足业务场景(本案例就属于这个情况)
 */
public class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) throws IllegalAgeException {
        if(age<0||age>100){
            /*
                Exception下有两种分类:
                检查异常和非检查异常
                非检查异常:当程序抛出此类异常时，编译器并不强制处理该异常。
                         不检查是否提供了异常处理机制。
                检查异常:当程序抛出此类异常，编译器会检查是否有异常处理机制处理
                       该异常，没有则编译不通过。

                RuntimeException是非检查异常，剩下的全是检查异常。
                其子类型异常也属于非检查异常
                NullPointerException                空指针异常
                ArrayIndexOutOfBoundsException      数组下标越界异常
                NumberFormatException               数字格式异常
                ClassCastException                  类造型异常

                RuntimeException异常定义的都属于BUG级别的问题，都是可以通过逻辑
                避免掉的异常。
             */
//            throw new RuntimeException("年龄不合法");
            /*
                当使用throw抛出一个非RuntimeException的其他异常时必须
                在当前方法上使用throws声明该异常的抛出
             */
            throw new IllegalAgeException("年龄不合法");
        }
        this.age = age;
    }
}
